#include "main.h"
int main(int argc, const char *argv[])
{
	//1、创建套接字
	int S=socket(AF_INET,SOCK_STREAM,0);
	if(-1==S){perror("创建套接字失败");return -1;}
	//2、绑定服务器IP和port
	struct sockaddr_in addr={0};
	addr.sin_family=AF_INET;
	addr.sin_port=htons(12345);
	addr.sin_addr.s_addr=inet_addr("192.168.126.97");
	if(bind(S,(const struct sockaddr*)&addr,sizeof(addr))==-1){perror("绑定失败");return -1;}
	//3、监听
	listen(S,10);
	/////////////////////////////////////////////////////////////////////////////////////////
	////创建监视列表
	int epoll=epoll_create(EPOLL_CLOEXEC);
	struct epoll_event text={0};
	////将服务器描述符加入监视列表
	text.data.fd=S;text.events=EPOLLIN;
	epoll_ctl(epoll,EPOLL_CTL_ADD,S,&text);
	////将标准输入描述符加入监视列表
	text.data.fd=0;text.events=EPOLLIN;
	epoll_ctl(epoll,EPOLL_CTL_ADD,0,&text);
	////创建返回事件结构体数组
	struct epoll_event epollbuf[10]={0};
	printf("阻塞监听描述符\n");
	while(1)
	{
		//阻塞监听描述符
		int len=epoll_wait(epoll,epollbuf,10,-1);
		for(int i=0;i<len;i++)
		{
			if(epollbuf[i].data.fd==S)//服务器
			{
				int CC=accept(S,NULL,NULL);
				text.data.fd=CC;text.events=EPOLLIN;
				epoll_ctl(epoll,EPOLL_CTL_ADD,CC,&text);
				printf("客户端<%d>建立连接\n",CC);
			}
			else if(epollbuf[i].data.fd==0)//标准输入
			{
				char buf[128]={0};
				scanf("%127c",buf);
				while(getchar()!=10);
				printf("标准输入流输入：%s\n",buf);
			}
			else//客户端
			{
				int pox=0;//客户端请求类型
				int ret=read(epollbuf[i].data.fd,&pox,4);
				printf("客户端<%d>请求:%d\n",epollbuf[i].data.fd,pox);
				if(ret==0)//客户端断开连接
				{
					epoll_ctl(epoll,EPOLL_CTL_DEL,epollbuf[i].data.fd,NULL);
					printf("客户端<%d>断开连接\n",epollbuf[i].data.fd);
					continue;
				}
				write(epollbuf[i].data.fd,&pox,4);
				switch(pox)
				{
				case 1://发送消息
					break;
				case 2://文件拷贝
					client_read_cp(epollbuf[i].data.fd);
					break;
				default:
					sleep(1);
					printf("无此选项\n");
				}
			}
		}

	}
	return 0;
}
